package com.dys.designpattern.singleton;

/**
 * @author 田建松
 * @version V1.0.0
 * @description 3.单例模式-双重检查
 * @date 2024/5/9
 * @since 1.0
 */
public class DoubleCheckLazySingleton {

    /**
     * 1.构造器私有化
     */
    private DoubleCheckLazySingleton() {
        // 防止反射破坏
        if (instance!=null) {
            throw new RuntimeException("不允许非法访问");
        }
    }

    /**
     * 2.使用volatile关键字,可以保证变量的可见性
     */
    private static volatile DoubleCheckLazySingleton instance = null;

    /**
     * 3.公有静态方法用来获取内部实例
     *
     * @return 内部实例
     */
    public static DoubleCheckLazySingleton getInstance() {
        // 1.第一次判断instance非空,不进入抢锁阶段,直接返回示例
        if (instance == null) {
            synchronized (DoubleCheckLazySingleton.class) {
                // 2.抢到锁之后再次判断实例是否为null
                if (instance == null) {
                    instance = new DoubleCheckLazySingleton();
                }
            }
        }
        return instance;
    }

    /**
     * 防止反序列化对于单例模式的破坏
     */
    private Object readResolve() {
        return instance;
    }
}
